<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit - Firmware API: poly.c Source File</title>
<link href="mt_doxygen.css" rel="stylesheet" type="text/css" />
<link href="../resources/mt_doxytabs.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
.header {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12pt;
	color: #222222;
}
-->
</style>
</head>

<body>
<table width="800" border="0">
    <tr>
      <td colspan="3">
        <form method="get" action="http://www.google.com/search">
          <div align="right">
            <input type="text"   name="q" size="25"
              maxlength="255" value="" />
            <input type="submit" value="Search" />
            <input type="hidden" name="sitesearch" value="makingthings.com/ref/firmware/html" />
          </div>
        </form>
       </td>
    </tr>
    <tr>
      <td><div align="center"><a href="http://www.makingthings.com">
				<img src="../resources/logo_brown_medium.png" alt="MakingThings"
									width="200" height="78" border="0" align="middle" longdesc="http://www.makingthings.com" /></a></div></td>
				<td><div align="center" class="header">
      		Make Controller Kit <br />
          Firmware API
      </div></td>
      <td><div align="center"><a href="http://www.makezine.com">
					<img src="../resources/make_logo.png" alt="MAKE Zine" 
										width="164" height="73" border="0" align="middle" longdesc="http://www.makezine.com" /></a></div></td>
    </tr>
</table>
</body>
</html>
<!-- Generated by Doxygen 1.5.4 -->
<script type="text/javascript">
<!--
function changeDisplayState (e){
  var num=this.id.replace(/[^[0-9]/g,'');
  var button=this.firstChild;
  var sectionDiv=document.getElementById('dynsection'+num);
  if (sectionDiv.style.display=='none'||sectionDiv.style.display==''){
    sectionDiv.style.display='block';
    button.src='open.gif';
  }else{
    sectionDiv.style.display='none';
    button.src='closed.gif';
  }
}
function initDynSections(){
  var divs=document.getElementsByTagName('div');
  var sectionCounter=1;
  for(var i=0;i<divs.length-1;i++){
    if(divs[i].className=='dynheader'&&divs[i+1].className=='dynsection'){
      var header=divs[i];
      var section=divs[i+1];
      var button=header.firstChild;
      if (button!='IMG'){
        divs[i].insertBefore(document.createTextNode(' '),divs[i].firstChild);
        button=document.createElement('img');
        divs[i].insertBefore(button,divs[i].firstChild);
      }
      header.style.cursor='pointer';
      header.onclick=changeDisplayState;
      header.id='dynheader'+sectionCounter;
      button.src='closed.gif';
      section.id='dynsection'+sectionCounter;
      section.style.display='none';
      section.style.marginLeft='14px';
      sectionCounter++;
    }
  }
}
window.onload = initDynSections;
-->
</script>
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="modules.html"><span>Modules</span></a></li>
    <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
    <li class="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
  </ul>
</div>
<h1>poly.c</h1><a href="poly_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*********************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment"></span>
<a name="l00003"></a>00003 <span class="comment"> Copyright 2006 MakingThings</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> Licensed under the Apache License, </span>
<a name="l00006"></a>00006 <span class="comment"> Version 2.0 (the "License"); you may not use this file except in compliance </span>
<a name="l00007"></a>00007 <span class="comment"> with the License. You may obtain a copy of the License at</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment"> http://www.apache.org/licenses/LICENSE-2.0 </span>
<a name="l00010"></a>00010 <span class="comment"> </span>
<a name="l00011"></a>00011 <span class="comment"> Unless required by applicable law or agreed to in writing, software distributed</span>
<a name="l00012"></a>00012 <span class="comment"> under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR</span>
<a name="l00013"></a>00013 <span class="comment"> CONDITIONS OF ANY KIND, either express or implied. See the License for</span>
<a name="l00014"></a>00014 <span class="comment"> the specific language governing permissions and limitations under the License.</span>
<a name="l00015"></a>00015 <span class="comment"></span>
<a name="l00016"></a>00016 <span class="comment">*********************************************************************************/</span>
<a name="l00017"></a>00017 <span class="comment"></span>
<a name="l00018"></a>00018 <span class="comment">/** \file poly.c  </span>
<a name="l00019"></a>00019 <span class="comment">  Poly Functions.</span>
<a name="l00020"></a>00020 <span class="comment">  Functions for permitting the Make Controller Board perform simple functions without</span>
<a name="l00021"></a>00021 <span class="comment">  programming or any computer intervention at all.</span>
<a name="l00022"></a>00022 <span class="comment">*/</span>
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 <span class="preprocessor">#include "stdlib.h"</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "config.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "poly.h"</span> 
<a name="l00027"></a>00027 <span class="preprocessor">#include "eeprom.h"</span>
<a name="l00028"></a>00028 
<a name="l00029"></a>00029 <span class="keywordtype">void</span> Poly_LineInit( <span class="keywordtype">void</span> );
<a name="l00030"></a>00030 
<a name="l00031"></a>00031 <span class="keywordtype">void</span> PolyTask( <span class="keywordtype">void</span>* p );
<a name="l00032"></a>00032 
<a name="l00033"></a>00033 <span class="comment">//</span>
<a name="l00034"></a>00034 <span class="comment">// Top level Poly routines</span>
<a name="l00035"></a>00035 <span class="comment">// </span>
<a name="l00036"></a>00036 <span class="keywordtype">void</span>  Poly_DeInit( <span class="keywordtype">int</span> function, <span class="keywordtype">void</span>* voidStruct );
<a name="l00037"></a>00037 <span class="keywordtype">void</span>* Poly_Init( <span class="keywordtype">int</span> function, <span class="keywordtype">int</span> bank );
<a name="l00038"></a>00038 <span class="keywordtype">void</span>  Poly_Run( <span class="keywordtype">int</span> function, <span class="keywordtype">void</span>* data, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants );
<a name="l00039"></a>00039 
<a name="l00040"></a>00040 <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l00041"></a>00041 {
<a name="l00042"></a>00042   <span class="keywordtype">int</span> mode0;
<a name="l00043"></a>00043   <span class="keywordtype">int</span> mode1;
<a name="l00044"></a>00044   <span class="keywordtype">int</span> running;
<a name="l00045"></a>00045   <span class="keywordtype">int</span> readContants;
<a name="l00046"></a>00046 } PolyStruct;
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 PolyStruct Poly;
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 <span class="comment">//</span>
<a name="l00051"></a>00051 <span class="comment">// 1 - Timer stuff</span>
<a name="l00052"></a>00052 <span class="comment">//</span>
<a name="l00053"></a>00053 <span class="keywordtype">void</span>* Timer_Init( <span class="keywordtype">int</span> bank );
<a name="l00054"></a>00054 <span class="keywordtype">void</span> Timer_Run( <span class="keywordtype">void</span>* timerVP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants );
<a name="l00055"></a>00055 <span class="keywordtype">void</span> Timer_DeInit( <span class="keywordtype">void</span>* voidStruct );
<a name="l00056"></a>00056 
<a name="l00057"></a>00057 <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l00058"></a>00058 {
<a name="l00059"></a>00059   <span class="keywordtype">int</span> bank; <span class="comment">// 0 or 1</span>
<a name="l00060"></a>00060   <span class="keywordtype">int</span> baseIn;
<a name="l00061"></a>00061   <span class="keywordtype">int</span> baseOut;
<a name="l00062"></a>00062   <span class="keywordtype">int</span> baseAux;
<a name="l00063"></a>00063  
<a name="l00064"></a>00064   <span class="keywordtype">int</span> timerSoFar;
<a name="l00065"></a>00065   <span class="keywordtype">int</span> timerDuration;
<a name="l00066"></a>00066   <span class="keywordtype">int</span> timerDurationHalf;
<a name="l00067"></a>00067   <span class="keywordtype">int</span> timerDurationQuarter;
<a name="l00068"></a>00068   <span class="keywordtype">int</span> lastPotValue;
<a name="l00069"></a>00069   
<a name="l00070"></a>00070   <span class="keywordtype">int</span> lastIn0;
<a name="l00071"></a>00071   <span class="keywordtype">int</span> lastIn1;
<a name="l00072"></a>00072   
<a name="l00073"></a>00073   <span class="keywordtype">int</span> timerState;
<a name="l00074"></a>00074   <span class="keywordtype">int</span> timerStateHalf;
<a name="l00075"></a>00075   <span class="keywordtype">int</span> timerStateQuarter;
<a name="l00076"></a>00076 
<a name="l00077"></a>00077   <span class="keywordtype">int</span> readConstants;
<a name="l00078"></a>00078 
<a name="l00079"></a>00079   <span class="keywordtype">int</span> sustainMode;
<a name="l00080"></a>00080   <span class="keywordtype">int</span> sustainState;
<a name="l00081"></a>00081 } TimerStruct;
<a name="l00082"></a>00082 
<a name="l00083"></a>00083 <span class="keywordtype">void</span> Timer_SaveConstants( TimerStruct *tp );
<a name="l00084"></a>00084 
<a name="l00085"></a>00085 <span class="comment">//</span>
<a name="l00086"></a>00086 <span class="comment">// 2 - Follower stuff</span>
<a name="l00087"></a>00087 <span class="comment">//</span>
<a name="l00088"></a>00088 <span class="keywordtype">void</span>* Follower_Init( <span class="keywordtype">int</span> bank );
<a name="l00089"></a>00089 <span class="keywordtype">void</span> Follower_Run( <span class="keywordtype">void</span>* followerVP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants );
<a name="l00090"></a>00090 <span class="keywordtype">void</span> Follower_DeInit( <span class="keywordtype">void</span>* follower );
<a name="l00091"></a>00091 
<a name="l00092"></a>00092 <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l00093"></a>00093 {
<a name="l00094"></a>00094   <span class="keywordtype">int</span> bank;
<a name="l00095"></a>00095   <span class="keywordtype">int</span> baseIn;
<a name="l00096"></a>00096   <span class="keywordtype">int</span> baseOut;
<a name="l00097"></a>00097   <span class="keywordtype">int</span> baseAux;
<a name="l00098"></a>00098 
<a name="l00099"></a>00099   <span class="keywordtype">float</span> output;
<a name="l00100"></a>00100   <span class="keywordtype">float</span> rate;
<a name="l00101"></a>00101   <span class="keywordtype">int</span> lastRateValue;
<a name="l00102"></a>00102   <span class="keywordtype">int</span> input;
<a name="l00103"></a>00103 
<a name="l00104"></a>00104   <span class="keywordtype">int</span> peak;
<a name="l00105"></a>00105   <span class="keywordtype">int</span> readConstants;
<a name="l00106"></a>00106 
<a name="l00107"></a>00107 } FollowerStruct;
<a name="l00108"></a>00108 
<a name="l00109"></a>00109 <span class="keywordtype">void</span> Follower_SaveConstants( FollowerStruct *fp );
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 
<a name="l00112"></a>00112 <span class="comment">//</span>
<a name="l00113"></a>00113 <span class="comment">// 3 - Oscillator stuff</span>
<a name="l00114"></a>00114 <span class="comment">//</span>
<a name="l00115"></a>00115 
<a name="l00116"></a>00116 <span class="keywordtype">void</span>* Oscillator_Init( <span class="keywordtype">int</span> bank );
<a name="l00117"></a>00117 <span class="keywordtype">void</span> Oscillator_Run( <span class="keywordtype">void</span>* OscillatorP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants );
<a name="l00118"></a>00118 <span class="keywordtype">void</span> Oscillator_DeInit( <span class="keywordtype">void</span>* Oscillator );
<a name="l00119"></a>00119 
<a name="l00120"></a>00120 <span class="keyword">typedef</span> <span class="keyword">struct</span>
<a name="l00121"></a>00121 {
<a name="l00122"></a>00122   <span class="keywordtype">int</span> bank;
<a name="l00123"></a>00123   <span class="keywordtype">int</span> baseIn;
<a name="l00124"></a>00124   <span class="keywordtype">int</span> baseOut;
<a name="l00125"></a>00125   <span class="keywordtype">int</span> baseAux;
<a name="l00126"></a>00126 
<a name="l00127"></a>00127   <span class="keywordtype">int</span> state;
<a name="l00128"></a>00128   <span class="keywordtype">float</span> current;
<a name="l00129"></a>00129   <span class="keywordtype">float</span> periodOn;
<a name="l00130"></a>00130   <span class="keywordtype">float</span> periodOff;
<a name="l00131"></a>00131 
<a name="l00132"></a>00132   <span class="keywordtype">int</span> periodOnRaw;
<a name="l00133"></a>00133   <span class="keywordtype">int</span> periodOffRaw;
<a name="l00134"></a>00134 
<a name="l00135"></a>00135   <span class="keywordtype">int</span> readConstants;
<a name="l00136"></a>00136 
<a name="l00137"></a>00137 } OscillatorStruct;
<a name="l00138"></a>00138 
<a name="l00139"></a>00139 <span class="keywordtype">void</span> Oscillator_SaveConstants( OscillatorStruct *fp );
<a name="l00140"></a>00140 
<a name="l00141"></a>00141 <span class="comment">/*</span>
<a name="l00142"></a>00142 <span class="comment">  Poly Function - pre-cooked behaviors for experimentation.</span>
<a name="l00143"></a>00143 <span class="comment"></span>
<a name="l00144"></a>00144 <span class="comment">  4 ins &amp; 4 outs for each function</span>
<a name="l00145"></a>00145 <span class="comment">  2 banks: 3 DIP switch spots select which function</span>
<a name="l00146"></a>00146 <span class="comment">  Each function has an integer index (0-7):</span>
<a name="l00147"></a>00147 <span class="comment">    0 - Timer</span>
<a name="l00148"></a>00148 <span class="comment">    1 - Follower</span>
<a name="l00149"></a>00149 <span class="comment">    etc.</span>
<a name="l00150"></a>00150 <span class="comment">*/</span>
<a name="l00151"></a>00151 <span class="comment"></span>
<a name="l00152"></a>00152 <span class="comment">/** \defgroup Poly Poly</span>
<a name="l00153"></a>00153 <span class="comment">  The Poly subsystem controls onboard pre-baked functions.</span>
<a name="l00154"></a>00154 <span class="comment">* \ingroup Controller</span>
<a name="l00155"></a>00155 <span class="comment">* @{</span>
<a name="l00156"></a>00156 <span class="comment">*/</span>
<a name="l00157"></a>00157 <span class="comment"></span>
<a name="l00158"></a>00158 <span class="comment">/**</span>
<a name="l00159"></a>00159 <span class="comment">  Sets whether the Poly subsystem is active.</span>
<a name="l00160"></a>00160 <span class="comment">  @param value An integer specifying the active state of the subsystem - 1 (on) or 0 (off).</span>
<a name="l00161"></a>00161 <span class="comment">  @return CONTROLLER_OK (0) on success.</span>
<a name="l00162"></a>00162 <span class="comment">*/</span>
<a name="l00163"></a><a class="code" href="group___poly.html#g81ec14a21bc2b70fd61aca829f3754e0">00163</a> <span class="keywordtype">int</span> <a class="code" href="group___poly.html#g81ec14a21bc2b70fd61aca829f3754e0" title="Sets whether the Poly subsystem is active.">Poly_SetActive</a>( <span class="keywordtype">int</span> value )
<a name="l00164"></a>00164 {
<a name="l00165"></a>00165   <span class="keywordflow">if</span> ( value ) 
<a name="l00166"></a>00166   {  
<a name="l00167"></a>00167     <span class="keywordflow">if</span> ( !Poly.running )
<a name="l00168"></a>00168     {
<a name="l00169"></a>00169       Poly.running = <span class="keyword">true</span>;
<a name="l00170"></a>00170       <span class="comment">// Poly.readConstants = false;</span>
<a name="l00171"></a>00171       Poly.mode0 = -1;
<a name="l00172"></a>00172       Poly.mode1 = -1;
<a name="l00173"></a>00173       <a class="code" href="group___tasks.html#g784f87fb45eebb76d07478036ed228d3" title="Create a new task.">TaskCreate</a>( PolyTask, <span class="stringliteral">"Poly"</span>, 1600, NULL, 2 );
<a name="l00174"></a>00174     }
<a name="l00175"></a>00175   }
<a name="l00176"></a>00176   <span class="keywordflow">else</span>
<a name="l00177"></a>00177     Poly.running = <span class="keyword">false</span>;
<a name="l00178"></a>00178 
<a name="l00179"></a>00179   <span class="keywordflow">return</span> <a class="code" href="group___error.html#gaa42bc036fbba18487ae9a15cd1f2f94" title="All&amp;#39;s well here.">CONTROLLER_OK</a>;
<a name="l00180"></a>00180 }
<a name="l00181"></a>00181 
<a name="l00182"></a>00182 <span class="keywordtype">int</span> Poly_GetActive( )
<a name="l00183"></a>00183 {
<a name="l00184"></a>00184   <span class="keywordflow">return</span> Poly.running;
<a name="l00185"></a>00185 }
<a name="l00186"></a>00186 
<a name="l00187"></a>00187 <span class="preprocessor">#define POLY_SLEEP 20</span>
<a name="l00188"></a>00188 <span class="preprocessor"></span>
<a name="l00189"></a>00189 <span class="keywordtype">void</span> PolyTask( <span class="keywordtype">void</span>* p )
<a name="l00190"></a>00190 {
<a name="l00191"></a>00191   (void)p;
<a name="l00192"></a>00192   <span class="keywordtype">int</span> newDipSwitch;
<a name="l00193"></a>00193   <span class="keywordtype">int</span> oldDipSwitch = -1;
<a name="l00194"></a>00194   <span class="keywordtype">void</span>* data0 = NULL;
<a name="l00195"></a>00195   <span class="keywordtype">void</span>* data1 = NULL;
<a name="l00196"></a>00196   <span class="keywordtype">int</span> readConstants = <span class="keyword">false</span>;
<a name="l00197"></a>00197 
<a name="l00198"></a>00198   <span class="comment">// Make sure everything is off</span>
<a name="l00199"></a>00199   Poly_LineInit();
<a name="l00200"></a>00200 
<a name="l00201"></a>00201   <span class="keywordflow">while</span>( Poly.running )
<a name="l00202"></a>00202   {
<a name="l00203"></a>00203     newDipSwitch = <a class="code" href="group___dip_switch.html#gd2b31cfb003f107063c9daaf4fe5fcff" title="Read the current configuration of the on-board DIP switch.">DipSwitch_GetValue</a>( );
<a name="l00204"></a>00204     <span class="keywordflow">if</span>( newDipSwitch != oldDipSwitch )
<a name="l00205"></a>00205     {
<a name="l00206"></a>00206       <span class="keywordtype">int</span> newMode0;
<a name="l00207"></a>00207       <span class="keywordtype">int</span> newMode1;
<a name="l00208"></a>00208       
<a name="l00209"></a>00209       <span class="keywordflow">if</span> ( !( newDipSwitch &amp; 0x80 ) )
<a name="l00210"></a>00210       {
<a name="l00211"></a>00211         newMode0 = 0;
<a name="l00212"></a>00212         newMode1 = 0;
<a name="l00213"></a>00213       }
<a name="l00214"></a>00214       <span class="keywordflow">else</span>
<a name="l00215"></a>00215       {
<a name="l00216"></a>00216         newMode0 = (newDipSwitch &amp; 0x0E) &gt;&gt; 1;
<a name="l00217"></a>00217         newMode1 = (newDipSwitch &amp; 0x70) &gt;&gt; 4;
<a name="l00218"></a>00218       }
<a name="l00219"></a>00219 
<a name="l00220"></a>00220       readConstants = ( newDipSwitch &amp; 0x01 ) ? 1 : 0;
<a name="l00221"></a>00221 
<a name="l00222"></a>00222       <span class="keywordflow">if</span>( newMode0 != Poly.mode0 )
<a name="l00223"></a>00223       {
<a name="l00224"></a>00224         Poly_DeInit( Poly.mode0, data0 );
<a name="l00225"></a>00225         data0 = Poly_Init( newMode0, 0 );
<a name="l00226"></a>00226         Poly.mode0 = newMode0;
<a name="l00227"></a>00227       }
<a name="l00228"></a>00228 
<a name="l00229"></a>00229       <span class="keywordflow">if</span>( newMode1 != Poly.mode1 )
<a name="l00230"></a>00230       {
<a name="l00231"></a>00231         Poly_DeInit( Poly.mode1, data1 );
<a name="l00232"></a>00232         data1 = Poly_Init( newMode1, 1 );
<a name="l00233"></a>00233         Poly.mode1 = newMode1;
<a name="l00234"></a>00234       }
<a name="l00235"></a>00235 
<a name="l00236"></a>00236       oldDipSwitch = newDipSwitch;
<a name="l00237"></a>00237     }
<a name="l00238"></a>00238 
<a name="l00239"></a>00239     Poly_Run( Poly.mode0, data0, POLY_SLEEP, readConstants );
<a name="l00240"></a>00240     Poly_Run( Poly.mode1, data1, POLY_SLEEP, readConstants );
<a name="l00241"></a>00241 
<a name="l00242"></a>00242     <span class="keywordflow">if</span> ( Poly.mode0 == 0 &amp;&amp; Poly.mode1 == 0 )
<a name="l00243"></a>00243       <a class="code" href="group___tasks.html#g9a64a7c0e24f257826103d1d1bbb44fa" title="Put a task to sleep for a given number of milliseconds.">Sleep</a>( POLY_SLEEP * 20 );
<a name="l00244"></a>00244     <span class="keywordflow">else</span>
<a name="l00245"></a>00245       <a class="code" href="group___tasks.html#g9a64a7c0e24f257826103d1d1bbb44fa" title="Put a task to sleep for a given number of milliseconds.">Sleep</a>( POLY_SLEEP );
<a name="l00246"></a>00246   }
<a name="l00247"></a>00247 
<a name="l00248"></a>00248   <a class="code" href="group___tasks.html#g5bc41573c59208d32d999e2f394ad3ce" title="Delete an existing task.">TaskDelete</a>( 0 );
<a name="l00249"></a>00249 }
<a name="l00250"></a>00250 
<a name="l00251"></a>00251 <span class="keywordtype">void</span>* Poly_Init( <span class="keywordtype">int</span> function, <span class="keywordtype">int</span> bank )
<a name="l00252"></a>00252 {
<a name="l00253"></a>00253   <span class="keywordflow">switch</span>( function )
<a name="l00254"></a>00254   {
<a name="l00255"></a>00255     <span class="keywordflow">case</span> 1: <span class="comment">// Timer</span>
<a name="l00256"></a>00256       <span class="keywordflow">return</span> Timer_Init( bank );
<a name="l00257"></a>00257       <span class="keywordflow">break</span>;
<a name="l00258"></a>00258     <span class="keywordflow">case</span> 2: <span class="comment">// Follower</span>
<a name="l00259"></a>00259       <span class="keywordflow">return</span> Follower_Init( bank );
<a name="l00260"></a>00260       <span class="keywordflow">break</span>;
<a name="l00261"></a>00261     <span class="keywordflow">case</span> 3: <span class="comment">// Oscillator</span>
<a name="l00262"></a>00262       <span class="keywordflow">return</span> Oscillator_Init( bank );
<a name="l00263"></a>00263       <span class="keywordflow">break</span>;
<a name="l00264"></a>00264     <span class="keywordflow">default</span>:
<a name="l00265"></a>00265       <span class="keywordflow">break</span>;
<a name="l00266"></a>00266   }
<a name="l00267"></a>00267 
<a name="l00268"></a>00268   <span class="keywordflow">return</span> 0;
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270 
<a name="l00271"></a>00271 <span class="keywordtype">void</span> Poly_DeInit( <span class="keywordtype">int</span> function, <span class="keywordtype">void</span>* data )
<a name="l00272"></a>00272 {
<a name="l00273"></a>00273   <span class="keywordflow">switch</span>( function )
<a name="l00274"></a>00274   {
<a name="l00275"></a>00275     <span class="keywordflow">case</span> 1: <span class="comment">// Timer</span>
<a name="l00276"></a>00276       Timer_DeInit( data );
<a name="l00277"></a>00277       <span class="keywordflow">break</span>;
<a name="l00278"></a>00278     <span class="keywordflow">case</span> 2: <span class="comment">// Follower</span>
<a name="l00279"></a>00279       Follower_DeInit( data );
<a name="l00280"></a>00280       <span class="keywordflow">break</span>;
<a name="l00281"></a>00281     <span class="keywordflow">case</span> 3: <span class="comment">// Oscillator</span>
<a name="l00282"></a>00282       Oscillator_DeInit( data );
<a name="l00283"></a>00283       <span class="keywordflow">break</span>;
<a name="l00284"></a>00284     <span class="keywordflow">default</span>:
<a name="l00285"></a>00285       <span class="keywordflow">break</span>;
<a name="l00286"></a>00286   }
<a name="l00287"></a>00287 }
<a name="l00288"></a>00288 
<a name="l00289"></a>00289 <span class="keywordtype">void</span> Poly_Run( <span class="keywordtype">int</span> function, <span class="keywordtype">void</span>* data, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants )
<a name="l00290"></a>00290 {
<a name="l00291"></a>00291   <span class="keywordflow">switch</span>( function )
<a name="l00292"></a>00292   {
<a name="l00293"></a>00293     <span class="keywordflow">case</span> 1: <span class="comment">// Timer</span>
<a name="l00294"></a>00294       Timer_Run( data, ms, readConstants );
<a name="l00295"></a>00295       <span class="keywordflow">break</span>;
<a name="l00296"></a>00296     <span class="keywordflow">case</span> 2: <span class="comment">// Follower</span>
<a name="l00297"></a>00297       Follower_Run( data, ms, readConstants );
<a name="l00298"></a>00298       <span class="keywordflow">break</span>;
<a name="l00299"></a>00299     <span class="keywordflow">case</span> 3: <span class="comment">// Oscillator</span>
<a name="l00300"></a>00300       Oscillator_Run( data, ms, readConstants );
<a name="l00301"></a>00301       <span class="keywordflow">break</span>;
<a name="l00302"></a>00302   }
<a name="l00303"></a>00303 }
<a name="l00304"></a>00304 
<a name="l00305"></a>00305 <span class="comment">//</span>
<a name="l00306"></a>00306 <span class="comment">// 1 - Timer Routines</span>
<a name="l00307"></a>00307 <span class="comment">//</span>
<a name="l00308"></a>00308 
<a name="l00309"></a>00309 <span class="comment">// TimerStruct Timer[2];  // temporary...debug malloc.</span>
<a name="l00310"></a>00310 
<a name="l00311"></a>00311 <span class="keywordtype">void</span>* Timer_Init( <span class="keywordtype">int</span> bank )
<a name="l00312"></a>00312 {
<a name="l00313"></a>00313   TimerStruct* timer;   <span class="comment">//create a pointer to a new TimerStruct</span>
<a name="l00314"></a>00314   timer = (TimerStruct*)<a class="code" href="group___utils.html#gf8ee6a74b03a39bce7c3b7d95fea303c" title="Dynamically allocate memory from the heap.">Malloc</a>( <span class="keyword">sizeof</span>( TimerStruct ) );
<a name="l00315"></a>00315   <span class="comment">//timer = &amp;Timer[bank];</span>
<a name="l00316"></a>00316   
<a name="l00317"></a>00317   timer-&gt;bank = bank;
<a name="l00318"></a>00318   timer-&gt;baseIn = bank * 4;
<a name="l00319"></a>00319   timer-&gt;baseOut = ( 1 - bank ) * 4;
<a name="l00320"></a>00320   timer-&gt;baseAux = bank * 2;
<a name="l00321"></a>00321 
<a name="l00322"></a>00322   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_TIMER_DURATION + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;timer-&gt;timerDuration, 4 );
<a name="l00323"></a>00323   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_TIMER_SUSTAIN + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;timer-&gt;sustainMode, 4 );
<a name="l00324"></a>00324   <span class="keywordflow">if</span> ( timer-&gt;sustainMode )
<a name="l00325"></a>00325     timer-&gt;sustainMode = 1;
<a name="l00326"></a>00326   <span class="keywordflow">else</span>
<a name="l00327"></a>00327     timer-&gt;sustainMode = 0;
<a name="l00328"></a>00328 
<a name="l00329"></a>00329   timer-&gt;timerSoFar = 0;
<a name="l00330"></a>00330   timer-&gt;timerDurationHalf = 0;
<a name="l00331"></a>00331   timer-&gt;timerDurationQuarter = 0;
<a name="l00332"></a>00332   timer-&gt;lastPotValue = 0;
<a name="l00333"></a>00333   
<a name="l00334"></a>00334   timer-&gt;lastIn0 = 0;
<a name="l00335"></a>00335   timer-&gt;lastIn1 = 0;
<a name="l00336"></a>00336   
<a name="l00337"></a>00337   timer-&gt;timerState = 1;
<a name="l00338"></a>00338   timer-&gt;timerStateHalf = 1;
<a name="l00339"></a>00339   timer-&gt;timerStateQuarter = 1;
<a name="l00340"></a>00340   
<a name="l00341"></a>00341   <span class="comment">// make sure the outputs are initialized properly</span>
<a name="l00342"></a>00342   <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( timer-&gt;baseOut, 0 );
<a name="l00343"></a>00343   <span class="keywordtype">int</span> i;
<a name="l00344"></a>00344   <span class="keywordflow">for</span>( i = 1; i &lt; 4; i++ )
<a name="l00345"></a>00345     <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( timer-&gt;baseOut + i, 1 );
<a name="l00346"></a>00346   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( timer-&gt;baseAux, 0 );
<a name="l00347"></a>00347   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( timer-&gt;baseAux + 1, 1 );
<a name="l00348"></a>00348   <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( timer-&gt;baseAux, 0 );
<a name="l00349"></a>00349   <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( timer-&gt;baseAux + 1, 0 );
<a name="l00350"></a>00350 
<a name="l00351"></a>00351   <span class="keywordflow">return</span> (<span class="keywordtype">void</span>*)timer;
<a name="l00352"></a>00352 }
<a name="l00353"></a>00353 
<a name="l00354"></a>00354 <span class="keywordtype">void</span> Timer_Run( <span class="keywordtype">void</span>* timerVP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants )
<a name="l00355"></a>00355 {
<a name="l00356"></a>00356   TimerStruct* tp = (TimerStruct*)timerVP;
<a name="l00357"></a>00357   <span class="comment">// Deal with current pulse</span>
<a name="l00358"></a>00358   <span class="keywordflow">if</span> ( !tp-&gt;timerState  ) <span class="comment">// if the timer is not expired</span>
<a name="l00359"></a>00359   { 
<a name="l00360"></a>00360     tp-&gt;timerSoFar += ms;
<a name="l00361"></a>00361 
<a name="l00362"></a>00362     <span class="keywordflow">if</span> ( tp-&gt;timerSoFar &gt; tp-&gt;timerDuration )
<a name="l00363"></a>00363       tp-&gt;timerSoFar = tp-&gt;timerDuration ;
<a name="l00364"></a>00364 
<a name="l00365"></a>00365     <span class="comment">// Calculate servo positions</span>
<a name="l00366"></a>00366     <span class="keywordtype">int</span> position = 2048 * tp-&gt;timerSoFar / tp-&gt;timerDuration;
<a name="l00367"></a>00367     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( tp-&gt;baseAux, ( position &gt;&gt; 2 ) );
<a name="l00368"></a>00368     <span class="keywordtype">int</span> position1 = ( position &lt; 1023) ? position : 2048 - position;
<a name="l00369"></a>00369     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( tp-&gt;baseAux + 1, position1 );
<a name="l00370"></a>00370     
<a name="l00371"></a>00371     <span class="keywordflow">if</span> ( !tp-&gt;timerStateHalf &amp;&amp; tp-&gt;timerSoFar &gt;= tp-&gt;timerDurationHalf )
<a name="l00372"></a>00372     {
<a name="l00373"></a>00373       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( tp-&gt;baseOut + 3, 1 );  <span class="comment">// set the "timer half-expired" output</span>
<a name="l00374"></a>00374       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux + 1, 1 ); 
<a name="l00375"></a>00375       tp-&gt;timerStateHalf = 1;    <span class="comment">// and set the flag accordingly</span>
<a name="l00376"></a>00376     }
<a name="l00377"></a>00377     
<a name="l00378"></a>00378     <span class="keywordflow">if</span> ( !tp-&gt;timerStateQuarter &amp;&amp; tp-&gt;timerSoFar &gt;= tp-&gt;timerDurationQuarter )
<a name="l00379"></a>00379     {
<a name="l00380"></a>00380       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( tp-&gt;baseOut + 2, 1 );  <span class="comment">// set the "timer quarter-expired" output</span>
<a name="l00381"></a>00381       tp-&gt;timerStateQuarter = 1;
<a name="l00382"></a>00382     }
<a name="l00383"></a>00383     
<a name="l00384"></a>00384     <span class="keywordflow">if</span> ( tp-&gt;timerSoFar &gt;= tp-&gt;timerDuration  )
<a name="l00385"></a>00385     {
<a name="l00386"></a>00386       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( tp-&gt;baseOut, 0 );  <span class="comment">// turn off the "time remaining" output</span>
<a name="l00387"></a>00387       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( tp-&gt;baseOut + 1, 1 );  <span class="comment">// turn on the "time expired" output</span>
<a name="l00388"></a>00388       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux, 0 ); 
<a name="l00389"></a>00389       tp-&gt;timerState = 1;      
<a name="l00390"></a>00390     }
<a name="l00391"></a>00391   }
<a name="l00392"></a>00392   
<a name="l00393"></a>00393   <span class="comment">// if we're authorized to read constants from inputs</span>
<a name="l00394"></a>00394   <span class="keywordflow">if</span> ( readConstants )
<a name="l00395"></a>00395   {
<a name="l00396"></a>00396     <span class="comment">// Deal with changing time </span>
<a name="l00397"></a>00397     <span class="keywordtype">int</span> newPotValue = <a class="code" href="group___analog_in.html#g66a6bd10fbb5fc80f32994b756cf0412" title="Read the value of an analog input.">AnalogIn_GetValue</a>( tp-&gt;baseIn + 3 );    <span class="comment">// assuming the pot jumper is connected...</span>
<a name="l00398"></a>00398     <span class="keywordflow">if</span> ( newPotValue != tp-&gt;lastPotValue )  <span class="comment">// if the value has changed</span>
<a name="l00399"></a>00399     {
<a name="l00400"></a>00400       tp-&gt;lastPotValue = newPotValue; <span class="comment">// save it for next time</span>
<a name="l00401"></a>00401       
<a name="l00402"></a>00402       <span class="comment">// need to adjust scale - make sure we're not dividing by zero</span>
<a name="l00403"></a>00403       <span class="comment">// potvalue squared seems right, but then divided by something that will</span>
<a name="l00404"></a>00404       <span class="comment">// give good control.  If the poly system works on 5ms intervals, squared</span>
<a name="l00405"></a>00405       <span class="comment">// and divided by 1000, gives 2.5s at half, 10s at full on an exponential</span>
<a name="l00406"></a>00406       <span class="comment">// scale.</span>
<a name="l00407"></a>00407       tp-&gt;timerDuration = newPotValue * newPotValue / 50;
<a name="l00408"></a>00408       <span class="keywordflow">if</span>( tp-&gt;timerDuration == 0 )
<a name="l00409"></a>00409         tp-&gt;timerDuration = 1;
<a name="l00410"></a>00410       
<a name="l00411"></a>00411       tp-&gt;timerDurationHalf = tp-&gt;timerDuration / 2;
<a name="l00412"></a>00412       <span class="keywordflow">if</span>( tp-&gt;timerDurationHalf == 0 )
<a name="l00413"></a>00413         tp-&gt;timerDurationHalf = 1;
<a name="l00414"></a>00414       
<a name="l00415"></a>00415       tp-&gt;timerDurationQuarter = tp-&gt;timerDuration - tp-&gt;timerDuration / 4;
<a name="l00416"></a>00416       <span class="keywordflow">if</span>( tp-&gt;timerDurationQuarter == 0 )
<a name="l00417"></a>00417         tp-&gt;timerDurationQuarter = 1;
<a name="l00418"></a>00418       
<a name="l00419"></a>00419       <span class="keywordflow">if</span> ( tp-&gt;timerState &amp;&amp; tp-&gt;timerSoFar &gt; tp-&gt;timerDuration )
<a name="l00420"></a>00420         tp-&gt;timerSoFar = tp-&gt;timerDuration - 1;
<a name="l00421"></a>00421     }
<a name="l00422"></a>00422 
<a name="l00423"></a>00423     <span class="comment">// Read sustain mode</span>
<a name="l00424"></a>00424     tp-&gt;sustainMode = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( tp-&gt;baseIn + 2 );
<a name="l00425"></a>00425   }
<a name="l00426"></a>00426   <span class="keywordflow">else</span>
<a name="l00427"></a>00427   {
<a name="l00428"></a>00428     <span class="comment">// If the switch is off, save the constants</span>
<a name="l00429"></a>00429     <span class="keywordflow">if</span> ( tp-&gt;readConstants )
<a name="l00430"></a>00430       Timer_SaveConstants( tp );
<a name="l00431"></a>00431   }
<a name="l00432"></a>00432   tp-&gt;readConstants = readConstants;
<a name="l00433"></a>00433   
<a name="l00434"></a>00434   <span class="comment">// Check for new triggers</span>
<a name="l00435"></a>00435   <span class="keywordtype">int</span> trigger = 0;
<a name="l00436"></a>00436   <span class="keywordtype">int</span> newIn0 = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( tp-&gt;baseIn ); 
<a name="l00437"></a>00437   <span class="keywordflow">if</span> ( newIn0 != tp-&gt;lastIn0 || tp-&gt;sustainMode )
<a name="l00438"></a>00438   {
<a name="l00439"></a>00439     <span class="keywordflow">if</span> ( newIn0 == 1 )    <span class="comment">// if the main trigger input is high</span>
<a name="l00440"></a>00440       trigger = 1;
<a name="l00441"></a>00441     tp-&gt;lastIn0 = newIn0;
<a name="l00442"></a>00442   }
<a name="l00443"></a>00443   
<a name="l00444"></a>00444   <span class="keywordtype">int</span> newIn1 = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( tp-&gt;baseIn + 1 );
<a name="l00445"></a>00445   <span class="keywordflow">if</span> ( newIn1 != tp-&gt;lastIn1 || tp-&gt;sustainMode )
<a name="l00446"></a>00446   {
<a name="l00447"></a>00447     <span class="keywordflow">if</span> ( newIn1 == 0 )  <span class="comment">// if the "inverted trigger" drops to 0</span>
<a name="l00448"></a>00448       trigger = 1;
<a name="l00449"></a>00449     tp-&gt;lastIn1 = newIn1;
<a name="l00450"></a>00450   }
<a name="l00451"></a>00451 
<a name="l00452"></a>00452   <span class="keywordflow">if</span> ( trigger )
<a name="l00453"></a>00453   {
<a name="l00454"></a>00454     <span class="comment">// set all the outputs to off except the "time expired" output</span>
<a name="l00455"></a>00455     <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( tp-&gt;baseOut, 1 );
<a name="l00456"></a>00456     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux, 1 );
<a name="l00457"></a>00457     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux + 1, 0 );
<a name="l00458"></a>00458     <span class="keywordtype">int</span> i;
<a name="l00459"></a>00459     <span class="keywordflow">for</span>( i = (tp-&gt;baseOut + 1); i &lt; (tp-&gt;baseOut + 4); i++ )
<a name="l00460"></a>00460       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( i, 0 );
<a name="l00461"></a>00461     tp-&gt;timerState = 0;
<a name="l00462"></a>00462     tp-&gt;timerStateHalf = 0;
<a name="l00463"></a>00463     tp-&gt;timerStateQuarter = 0;
<a name="l00464"></a>00464     tp-&gt;timerSoFar = 0;   <span class="comment">// reset the timer count</span>
<a name="l00465"></a>00465   }
<a name="l00466"></a>00466 }
<a name="l00467"></a>00467 
<a name="l00468"></a>00468 <span class="comment">// Set all the subsystems we've used to inactive</span>
<a name="l00469"></a>00469 <span class="comment">// so the IO lines can be used by the next function</span>
<a name="l00470"></a>00470 <span class="keywordtype">void</span> Timer_DeInit( <span class="keywordtype">void</span>* voidStruct )
<a name="l00471"></a>00471 {
<a name="l00472"></a>00472   TimerStruct* tp = (TimerStruct*)voidStruct;
<a name="l00473"></a>00473   <span class="keywordflow">if</span> ( tp != NULL )
<a name="l00474"></a>00474   {
<a name="l00475"></a>00475     <span class="keywordtype">int</span> i;
<a name="l00476"></a>00476     <span class="keywordflow">for</span>( i = tp-&gt;baseIn; i &lt; tp-&gt;baseIn + 4; i++ )
<a name="l00477"></a>00477     {
<a name="l00478"></a>00478       <a class="code" href="group___digital_in.html#g57b7c89eb7c9066b9484577390635f2e" title="Sets whether the specified Digital In is active.">DigitalIn_SetActive</a>( i, 0 );
<a name="l00479"></a>00479       <a class="code" href="group___analog_in.html#ga3ae1add8529d6e1882b6c7d5b376b94" title="Sets whether the specified channel is active.">AnalogIn_SetActive</a>( i, 0 );
<a name="l00480"></a>00480     }
<a name="l00481"></a>00481     <span class="keywordflow">for</span>( i = tp-&gt;baseOut; i &lt; tp-&gt;baseOut + 4; i++ )
<a name="l00482"></a>00482     {
<a name="l00483"></a>00483       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( i, 0 );
<a name="l00484"></a>00484       <a class="code" href="group___digital_out.html#ga98b65673615683dbdaa1fc7ee4e4f2f" title="Sets whether the specified Digital Out is active.">DigitalOut_SetActive</a>( i, 0 );
<a name="l00485"></a>00485     }
<a name="l00486"></a>00486     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux, 0 );
<a name="l00487"></a>00487     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( tp-&gt;baseAux + 1, 0 );
<a name="l00488"></a>00488     <a class="code" href="group___app_led.html#gd0ee0aad03c0aa89b442bf75e073510d" title="Attempts to gain access to the I/O lines associated the given LED.">AppLed_SetActive</a>( tp-&gt;baseAux, 0 );
<a name="l00489"></a>00489     <a class="code" href="group___app_led.html#gd0ee0aad03c0aa89b442bf75e073510d" title="Attempts to gain access to the I/O lines associated the given LED.">AppLed_SetActive</a>( tp-&gt;baseAux + 1, 0 );
<a name="l00490"></a>00490 
<a name="l00491"></a>00491     <a class="code" href="group___servo.html#g8ecf12d7f9b6c7130cac1f0c33270e4b" title="Lock or unlock the I/O lines used by the servos.">Servo_SetActive</a>( tp-&gt;baseAux, 0 );
<a name="l00492"></a>00492     <a class="code" href="group___servo.html#g8ecf12d7f9b6c7130cac1f0c33270e4b" title="Lock or unlock the I/O lines used by the servos.">Servo_SetActive</a>( tp-&gt;baseAux + 1, 0 );
<a name="l00493"></a>00493 
<a name="l00494"></a>00494     <span class="keywordflow">if</span> ( tp-&gt;readConstants )
<a name="l00495"></a>00495       Timer_SaveConstants( tp );
<a name="l00496"></a>00496 
<a name="l00497"></a>00497     <a class="code" href="group___utils.html#g6b0be54448d6ce393134400f4b22fa97" title="Free memory from the heap.">Free</a>( tp );
<a name="l00498"></a>00498   }
<a name="l00499"></a>00499   <span class="comment">// eventually free() the TimerStruct instances once malloc is working...?</span>
<a name="l00500"></a>00500 }
<a name="l00501"></a>00501 
<a name="l00502"></a>00502 <span class="keywordtype">void</span> Timer_SaveConstants( TimerStruct *tp )
<a name="l00503"></a>00503 {
<a name="l00504"></a>00504   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_TIMER_DURATION + ( tp-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;tp-&gt;timerDuration, 4 );
<a name="l00505"></a>00505   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_TIMER_SUSTAIN + ( tp-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;tp-&gt;sustainMode, 4 );
<a name="l00506"></a>00506 }
<a name="l00507"></a>00507 
<a name="l00508"></a>00508 <span class="comment">//</span>
<a name="l00509"></a>00509 <span class="comment">// 2 - Follower Routines</span>
<a name="l00510"></a>00510 <span class="comment">//</span>
<a name="l00511"></a>00511 
<a name="l00512"></a>00512 <span class="comment">//FollowerStruct Follower[2]; // eventually put these on the heap...</span>
<a name="l00513"></a>00513 
<a name="l00514"></a>00514 <span class="keywordtype">void</span>* Follower_Init( <span class="keywordtype">int</span> bank )
<a name="l00515"></a>00515 {
<a name="l00516"></a>00516   <span class="keywordtype">int</span> i;
<a name="l00517"></a>00517 
<a name="l00518"></a>00518   <span class="comment">//FollowerStruct* follower = &amp;Follower[bank];</span>
<a name="l00519"></a>00519   FollowerStruct* follower = (FollowerStruct*)<a class="code" href="group___utils.html#gf8ee6a74b03a39bce7c3b7d95fea303c" title="Dynamically allocate memory from the heap.">Malloc</a>( <span class="keyword">sizeof</span>( FollowerStruct ) );
<a name="l00520"></a>00520 
<a name="l00521"></a>00521   follower-&gt;bank = bank;
<a name="l00522"></a>00522 
<a name="l00523"></a>00523   follower-&gt;baseIn = bank * 4;
<a name="l00524"></a>00524   follower-&gt;baseOut = ( 1 - bank ) * 2;
<a name="l00525"></a>00525   follower-&gt;baseAux = bank * 2;
<a name="l00526"></a>00526 
<a name="l00527"></a>00527   follower-&gt;output = 0;
<a name="l00528"></a>00528   follower-&gt;rate = 0;
<a name="l00529"></a>00529   follower-&gt;lastRateValue = -2048;
<a name="l00530"></a>00530   follower-&gt;input = 0;
<a name="l00531"></a>00531 
<a name="l00532"></a>00532   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_FOLLOWER_RATE + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;follower-&gt;rate, 4 );
<a name="l00533"></a>00533   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_FOLLOWER_PEAK + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;follower-&gt;peak, 4 );
<a name="l00534"></a>00534 
<a name="l00535"></a>00535   <span class="keywordflow">if</span> ( follower-&gt;peak )
<a name="l00536"></a>00536     follower-&gt;peak = 1;
<a name="l00537"></a>00537   <span class="keywordflow">else</span>
<a name="l00538"></a>00538     follower-&gt;peak = 0;
<a name="l00539"></a>00539   
<a name="l00540"></a>00540   <span class="comment">// set up the PWM outs as inverted pairs, so we can use them to drive motors, etc.</span>
<a name="l00541"></a>00541   <span class="keywordflow">for</span>( i = follower-&gt;baseOut; i &lt; (follower-&gt;baseOut + 2); i++) <span class="comment">//2 PWMs for each bank of 4 outputs</span>
<a name="l00542"></a>00542   {
<a name="l00543"></a>00543     <a class="code" href="group___pwm_out.html#gff93dbb3a903c93cfe40b2776b085187" title="Set whether the A channel associated with a PWM out should be inverted.">PwmOut_SetInvertA</a>( i, 0 );
<a name="l00544"></a>00544     <a class="code" href="group___pwm_out.html#gf19ae422767d01e401b2475c4d7609ea" title="Read whether the B channel of a PWM out is inverted.">PwmOut_SetInvertB</a>( i, 1 );
<a name="l00545"></a>00545     <a class="code" href="group___pwm_out.html#g7274bfadd63e562e9dcad4b17bb19415" title="Set the speed of a PWM device.">PwmOut_SetDuty</a>( i, 0 ); <span class="comment">//initialize the outputs to 0</span>
<a name="l00546"></a>00546   }
<a name="l00547"></a>00547 
<a name="l00548"></a>00548   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( follower-&gt;baseAux, 0 );
<a name="l00549"></a>00549   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( follower-&gt;baseAux + 1, 0 );
<a name="l00550"></a>00550   <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( i, 0 );
<a name="l00551"></a>00551   <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( i + 1, 512 );
<a name="l00552"></a>00552 
<a name="l00553"></a>00553   <span class="keywordflow">return</span> (<span class="keywordtype">void</span>*)follower;
<a name="l00554"></a>00554 }
<a name="l00555"></a>00555 
<a name="l00556"></a>00556 <span class="keywordtype">void</span> Follower_Run( <span class="keywordtype">void</span>* followerVP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants )
<a name="l00557"></a>00557 {
<a name="l00558"></a>00558   FollowerStruct* fp = (FollowerStruct*)followerVP;
<a name="l00559"></a>00559   
<a name="l00560"></a>00560   <span class="keywordflow">if</span> ( readConstants )
<a name="l00561"></a>00561   {
<a name="l00562"></a>00562     <span class="comment">// For pair zero, read the rate</span>
<a name="l00563"></a>00563     <span class="keywordtype">int</span> newRateValue = <a class="code" href="group___analog_in.html#g66a6bd10fbb5fc80f32994b756cf0412" title="Read the value of an analog input.">AnalogIn_GetValue</a>( fp-&gt;baseIn + 3 );
<a name="l00564"></a>00564     <span class="keywordflow">if</span> ( newRateValue != fp-&gt;lastRateValue )
<a name="l00565"></a>00565     {
<a name="l00566"></a>00566       fp-&gt;lastRateValue = newRateValue;
<a name="l00567"></a>00567       <span class="keywordflow">if</span> ( newRateValue == 0 )
<a name="l00568"></a>00568         newRateValue = 1;
<a name="l00569"></a>00569       <span class="keywordflow">if</span> ( newRateValue &gt; 1020 )
<a name="l00570"></a>00570         fp-&gt;rate = 0;
<a name="l00571"></a>00571       <span class="keywordflow">else</span>
<a name="l00572"></a>00572         fp-&gt;rate = ( 10 * 1024.0 ) / (newRateValue * newRateValue );
<a name="l00573"></a>00573     }    
<a name="l00574"></a>00574     fp-&gt;peak = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( fp-&gt;baseIn + 2 );
<a name="l00575"></a>00575   }
<a name="l00576"></a>00576   <span class="keywordflow">else</span>
<a name="l00577"></a>00577   {
<a name="l00578"></a>00578     <span class="keywordflow">if</span> ( fp-&gt;readConstants )
<a name="l00579"></a>00579       Follower_SaveConstants( fp );
<a name="l00580"></a>00580   }
<a name="l00581"></a>00581   fp-&gt;readConstants = readConstants;
<a name="l00582"></a>00582 
<a name="l00583"></a>00583   <span class="keywordtype">int</span> <span class="keyword">set</span> = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( fp-&gt;baseIn + 1 );
<a name="l00584"></a>00584 
<a name="l00585"></a>00585   <span class="comment">// Now read the position</span>
<a name="l00586"></a>00586   <span class="keywordtype">int</span> input = <a class="code" href="group___analog_in.html#g66a6bd10fbb5fc80f32994b756cf0412" title="Read the value of an analog input.">AnalogIn_GetValue</a>( fp-&gt;baseIn );
<a name="l00587"></a>00587 
<a name="l00588"></a>00588   <span class="keywordtype">int</span> diff = input - fp-&gt;output;
<a name="l00589"></a>00589   <span class="keywordtype">float</span> change = fp-&gt;rate * (float)ms;
<a name="l00590"></a>00590         
<a name="l00591"></a>00591   <span class="keywordflow">if</span>( diff != 0 ) <span class="comment">// if the input has changed</span>
<a name="l00592"></a>00592   {
<a name="l00593"></a>00593     <span class="keywordflow">if</span>( diff &gt; 0 )  <span class="comment">// if the input is higher than last time</span>
<a name="l00594"></a>00594     {
<a name="l00595"></a>00595       fp-&gt;output += change; <span class="comment">// increment the output by the rate</span>
<a name="l00596"></a>00596       <span class="keywordflow">if</span>( fp-&gt;output &gt; input || fp-&gt;peak || <span class="keyword">set</span> )
<a name="l00597"></a>00597         fp-&gt;output = input; <span class="comment">// just set it to the input if it would otherwise be too high</span>
<a name="l00598"></a>00598       <span class="keywordflow">if</span> ( diff &gt; 1  )
<a name="l00599"></a>00599       {
<a name="l00600"></a>00600         <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux, 1 );     
<a name="l00601"></a>00601         <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux + 1, 0 );     
<a name="l00602"></a>00602       }
<a name="l00603"></a>00603       <a class="code" href="group___pwm_out.html#gba27993e99ff3cff0537ce050884f880" title="Set the duty and the inversion of both channels of a PWM device.">PwmOut_SetAll</a>( fp-&gt;baseOut + 1, diff, 0, 1 );
<a name="l00604"></a>00604     }
<a name="l00605"></a>00605     <span class="keywordflow">else</span>  <span class="comment">// the input is lower than last time</span>
<a name="l00606"></a>00606     {
<a name="l00607"></a>00607       fp-&gt;output -= change; 
<a name="l00608"></a>00608       <span class="keywordflow">if</span>( fp-&gt;output &lt; input || <span class="keyword">set</span> )
<a name="l00609"></a>00609         fp-&gt;output = input;
<a name="l00610"></a>00610       <span class="keywordflow">if</span> ( diff &lt; -1  )
<a name="l00611"></a>00611       {
<a name="l00612"></a>00612         <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux + 1, 1 );     
<a name="l00613"></a>00613         <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux, 0 );     
<a name="l00614"></a>00614       }
<a name="l00615"></a>00615       <a class="code" href="group___pwm_out.html#gba27993e99ff3cff0537ce050884f880" title="Set the duty and the inversion of both channels of a PWM device.">PwmOut_SetAll</a>( fp-&gt;baseOut + 1, -diff, 1, 0 );
<a name="l00616"></a>00616     }
<a name="l00617"></a>00617 
<a name="l00618"></a>00618     <span class="keywordtype">int</span> diff2 = diff / 2;
<a name="l00619"></a>00619     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( fp-&gt;baseAux + 1, 512 + diff2 );
<a name="l00620"></a>00620              
<a name="l00621"></a>00621     <span class="keywordtype">int</span> out = (int)fp-&gt;output;
<a name="l00622"></a>00622     <a class="code" href="group___pwm_out.html#g7274bfadd63e562e9dcad4b17bb19415" title="Set the speed of a PWM device.">PwmOut_SetDuty</a>( fp-&gt;baseOut, out );
<a name="l00623"></a>00623     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( fp-&gt;baseAux, out );
<a name="l00624"></a>00624   }
<a name="l00625"></a>00625   <span class="keywordflow">else</span>
<a name="l00626"></a>00626   {
<a name="l00627"></a>00627     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux, 0 );
<a name="l00628"></a>00628     <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( fp-&gt;baseAux + 1, 0 );
<a name="l00629"></a>00629     <a class="code" href="group___pwm_out.html#g7274bfadd63e562e9dcad4b17bb19415" title="Set the speed of a PWM device.">PwmOut_SetDuty</a>( fp-&gt;baseOut + 1, 0 );
<a name="l00630"></a>00630     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( fp-&gt;baseAux + 1, 512 );
<a name="l00631"></a>00631   }
<a name="l00632"></a>00632 
<a name="l00633"></a>00633 }
<a name="l00634"></a>00634 
<a name="l00635"></a>00635 <span class="keywordtype">void</span> Follower_DeInit( <span class="keywordtype">void</span>* follower )
<a name="l00636"></a>00636 {
<a name="l00637"></a>00637   FollowerStruct* fp = (FollowerStruct*)follower;
<a name="l00638"></a>00638   <span class="keywordflow">if</span> ( fp != NULL )
<a name="l00639"></a>00639   {
<a name="l00640"></a>00640     <span class="keywordtype">int</span> i;
<a name="l00641"></a>00641 
<a name="l00642"></a>00642     <span class="keywordflow">if</span> ( fp-&gt;readConstants )
<a name="l00643"></a>00643       Follower_SaveConstants( fp );
<a name="l00644"></a>00644 
<a name="l00645"></a>00645     <a class="code" href="group___analog_in.html#ga3ae1add8529d6e1882b6c7d5b376b94" title="Sets whether the specified channel is active.">AnalogIn_SetActive</a>( 0, 0 );
<a name="l00646"></a>00646     <a class="code" href="group___analog_in.html#ga3ae1add8529d6e1882b6c7d5b376b94" title="Sets whether the specified channel is active.">AnalogIn_SetActive</a>( 3, 0 );
<a name="l00647"></a>00647     <a class="code" href="group___digital_in.html#g57b7c89eb7c9066b9484577390635f2e" title="Sets whether the specified Digital In is active.">DigitalIn_SetActive</a>( 1, 0 );
<a name="l00648"></a>00648     <a class="code" href="group___digital_in.html#g57b7c89eb7c9066b9484577390635f2e" title="Sets whether the specified Digital In is active.">DigitalIn_SetActive</a>( 2, 0 );
<a name="l00649"></a>00649 
<a name="l00650"></a>00650     <span class="keywordflow">for</span>( i = fp-&gt;baseOut; i &lt; fp-&gt;baseOut + 2; i++ )
<a name="l00651"></a>00651     {
<a name="l00652"></a>00652       <a class="code" href="group___pwm_out.html#g7274bfadd63e562e9dcad4b17bb19415" title="Set the speed of a PWM device.">PwmOut_SetDuty</a>( i, 0 );
<a name="l00653"></a>00653       <a class="code" href="group___pwm_out.html#gacf6fba798cec68ce1ffe52e6908e380" title="Sets whether the specified PWM device is active.">PwmOut_SetActive</a>( i, 0 );
<a name="l00654"></a>00654     }
<a name="l00655"></a>00655     <span class="keywordflow">for</span>( i = fp-&gt;baseAux; i &lt; fp-&gt;baseAux + 2; i++ )
<a name="l00656"></a>00656     {
<a name="l00657"></a>00657       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( i, 0 );
<a name="l00658"></a>00658       <a class="code" href="group___app_led.html#gd0ee0aad03c0aa89b442bf75e073510d" title="Attempts to gain access to the I/O lines associated the given LED.">AppLed_SetActive</a>( i, 0 );
<a name="l00659"></a>00659       <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( i, 0 );
<a name="l00660"></a>00660       <a class="code" href="group___servo.html#g8ecf12d7f9b6c7130cac1f0c33270e4b" title="Lock or unlock the I/O lines used by the servos.">Servo_SetActive</a>( i, 0 );
<a name="l00661"></a>00661     }
<a name="l00662"></a>00662 
<a name="l00663"></a>00663     <a class="code" href="group___utils.html#g6b0be54448d6ce393134400f4b22fa97" title="Free memory from the heap.">Free</a>( fp );
<a name="l00664"></a>00664   }
<a name="l00665"></a>00665 }
<a name="l00666"></a>00666 
<a name="l00667"></a>00667 <span class="keywordtype">void</span> Follower_SaveConstants( FollowerStruct *fp )
<a name="l00668"></a>00668 {
<a name="l00669"></a>00669   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_FOLLOWER_RATE + ( fp-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;fp-&gt;rate, 4 );
<a name="l00670"></a>00670   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_FOLLOWER_PEAK + ( fp-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;fp-&gt;peak, 4 );
<a name="l00671"></a>00671 }
<a name="l00672"></a>00672 
<a name="l00673"></a>00673 <span class="comment">//</span>
<a name="l00674"></a>00674 <span class="comment">// 3 - Oscillator Routines</span>
<a name="l00675"></a>00675 <span class="comment">//</span>
<a name="l00676"></a>00676 
<a name="l00677"></a>00677 <span class="comment">//  int state;</span>
<a name="l00678"></a>00678 <span class="comment">//  float current;</span>
<a name="l00679"></a>00679 
<a name="l00680"></a>00680 <span class="comment">//  float periodOn;</span>
<a name="l00681"></a>00681 <span class="comment">//  float periodOff;</span>
<a name="l00682"></a>00682 <span class="comment">//  int periodOnRaw;</span>
<a name="l00683"></a>00683 <span class="comment">//  int periodOffRaw;</span>
<a name="l00684"></a>00684 
<a name="l00685"></a>00685 <span class="comment">// OscillatorStruct Oscillator[2]; // eventually put these on the heap...</span>
<a name="l00686"></a>00686 
<a name="l00687"></a>00687 <span class="keywordtype">void</span>* Oscillator_Init( <span class="keywordtype">int</span> bank )
<a name="l00688"></a>00688 {
<a name="l00689"></a>00689   <span class="keywordtype">int</span> i;
<a name="l00690"></a>00690 
<a name="l00691"></a>00691   OscillatorStruct* op = (OscillatorStruct*)<a class="code" href="group___utils.html#gf8ee6a74b03a39bce7c3b7d95fea303c" title="Dynamically allocate memory from the heap.">Malloc</a>( <span class="keyword">sizeof</span>( OscillatorStruct ) );
<a name="l00692"></a>00692 
<a name="l00693"></a>00693   op-&gt;bank = bank;
<a name="l00694"></a>00694 
<a name="l00695"></a>00695   op-&gt;baseIn = bank * 4;
<a name="l00696"></a>00696   op-&gt;baseOut = ( 1 - bank ) * 4;
<a name="l00697"></a>00697   op-&gt;baseAux = bank * 2;
<a name="l00698"></a>00698 
<a name="l00699"></a>00699   op-&gt;state = 0;
<a name="l00700"></a>00700   op-&gt;current = 0.0;
<a name="l00701"></a>00701 
<a name="l00702"></a>00702   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_OSCILLATOR_PERIODON + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;op-&gt;periodOn, 4 );
<a name="l00703"></a>00703   <a class="code" href="group___eeprom.html#g95bd921a774026d4cc96b20d6a20d9dd" title="Read data from the EEPROM.">Eeprom_Read</a>( EEPROM_POLY_0_OSCILLATOR_PERIODOFF + ( bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;op-&gt;periodOff, 4 );
<a name="l00704"></a>00704   
<a name="l00705"></a>00705   <span class="keywordflow">for</span>( i = op-&gt;baseOut; i &lt; (op-&gt;baseOut + 4); i++)
<a name="l00706"></a>00706     <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( i, 0 );
<a name="l00707"></a>00707 
<a name="l00708"></a>00708   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux, 1 );
<a name="l00709"></a>00709   <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux + 1, 0 );
<a name="l00710"></a>00710   <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( op-&gt;baseAux, 512 );
<a name="l00711"></a>00711 
<a name="l00712"></a>00712   <span class="keywordflow">return</span> (<span class="keywordtype">void</span>*)op;
<a name="l00713"></a>00713 }
<a name="l00714"></a>00714 
<a name="l00715"></a>00715 <span class="keywordtype">void</span> Oscillator_Run( <span class="keywordtype">void</span>* oscillatorVP, <span class="keywordtype">int</span> ms, <span class="keywordtype">int</span> readConstants )
<a name="l00716"></a>00716 {
<a name="l00717"></a>00717   OscillatorStruct* op = (OscillatorStruct*)oscillatorVP;
<a name="l00718"></a>00718   
<a name="l00719"></a>00719   <span class="keywordflow">if</span> ( readConstants )
<a name="l00720"></a>00720   {
<a name="l00721"></a>00721     <span class="keywordtype">int</span> periodOffRaw = <a class="code" href="group___analog_in.html#g66a6bd10fbb5fc80f32994b756cf0412" title="Read the value of an analog input.">AnalogIn_GetValue</a>( op-&gt;baseIn + 3 );
<a name="l00722"></a>00722     <span class="keywordflow">if</span> ( periodOffRaw != op-&gt;periodOffRaw )
<a name="l00723"></a>00723     {
<a name="l00724"></a>00724       op-&gt;periodOffRaw = periodOffRaw;
<a name="l00725"></a>00725       op-&gt;periodOff = (float)( periodOffRaw * periodOffRaw ) / 50.0;
<a name="l00726"></a>00726     }
<a name="l00727"></a>00727     <span class="keywordtype">int</span> periodOnRaw = <a class="code" href="group___analog_in.html#g66a6bd10fbb5fc80f32994b756cf0412" title="Read the value of an analog input.">AnalogIn_GetValue</a>( op-&gt;baseIn + 2 );
<a name="l00728"></a>00728     <span class="keywordflow">if</span> ( periodOnRaw != op-&gt;periodOnRaw )
<a name="l00729"></a>00729     {
<a name="l00730"></a>00730       op-&gt;periodOnRaw = periodOnRaw;
<a name="l00731"></a>00731       <span class="keywordflow">if</span> ( periodOnRaw &lt; 2 )
<a name="l00732"></a>00732         op-&gt;periodOn = op-&gt;periodOff;
<a name="l00733"></a>00733       <span class="keywordflow">else</span>
<a name="l00734"></a>00734         op-&gt;periodOn = (float)( periodOnRaw * periodOffRaw ) / 50.0;
<a name="l00735"></a>00735     }
<a name="l00736"></a>00736     <span class="keywordflow">else</span>
<a name="l00737"></a>00737     {
<a name="l00738"></a>00738       <span class="keywordflow">if</span> ( periodOnRaw &lt; 2 )
<a name="l00739"></a>00739         op-&gt;periodOn = op-&gt;periodOff;
<a name="l00740"></a>00740     }
<a name="l00741"></a>00741   }
<a name="l00742"></a>00742   <span class="keywordflow">else</span>
<a name="l00743"></a>00743   {
<a name="l00744"></a>00744     <span class="keywordflow">if</span> ( op-&gt;readConstants )
<a name="l00745"></a>00745       Oscillator_SaveConstants( op );
<a name="l00746"></a>00746   }
<a name="l00747"></a>00747   op-&gt;readConstants = readConstants;
<a name="l00748"></a>00748 
<a name="l00749"></a>00749   <span class="keywordtype">int</span> setOn = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( op-&gt;baseIn + 0 );
<a name="l00750"></a>00750   <span class="keywordtype">int</span> setOff = <a class="code" href="group___digital_in.html#ged5738c1a0cb3c2abd0db41d21e98742" title="Read the value of a Digital Input on the MAKE Application Board.">DigitalIn_GetValue</a>( op-&gt;baseIn + 1 );
<a name="l00751"></a>00751 
<a name="l00752"></a>00752   <span class="keywordtype">int</span> stateNew = op-&gt;state;
<a name="l00753"></a>00753   <span class="keywordflow">if</span> ( setOn )
<a name="l00754"></a>00754   {
<a name="l00755"></a>00755     stateNew = 1;
<a name="l00756"></a>00756     op-&gt;current = 0.0;
<a name="l00757"></a>00757   }
<a name="l00758"></a>00758   <span class="keywordflow">if</span> ( setOff )
<a name="l00759"></a>00759   {
<a name="l00760"></a>00760     stateNew = 0;
<a name="l00761"></a>00761     op-&gt;current = 0.0;
<a name="l00762"></a>00762   }
<a name="l00763"></a>00763 
<a name="l00764"></a>00764   op-&gt;current += ms;
<a name="l00765"></a>00765  
<a name="l00766"></a>00766   <span class="keywordflow">if</span> ( op-&gt;current &gt; ( ( stateNew ) ? op-&gt;periodOn : op-&gt;periodOff ) )
<a name="l00767"></a>00767   {
<a name="l00768"></a>00768     stateNew = !stateNew;
<a name="l00769"></a>00769     op-&gt;current = 0.0;
<a name="l00770"></a>00770   }
<a name="l00771"></a>00771 
<a name="l00772"></a>00772   <span class="keywordflow">if</span> ( stateNew != op-&gt;state )
<a name="l00773"></a>00773   {
<a name="l00774"></a>00774     <span class="keywordflow">if</span> ( stateNew )
<a name="l00775"></a>00775     {
<a name="l00776"></a>00776       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux, 0 );     
<a name="l00777"></a>00777       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux + 1, 1 );     
<a name="l00778"></a>00778       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( op-&gt;baseOut, 1 );
<a name="l00779"></a>00779       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( op-&gt;baseOut + 1, 0 );
<a name="l00780"></a>00780     }
<a name="l00781"></a>00781     <span class="keywordflow">else</span>
<a name="l00782"></a>00782     {
<a name="l00783"></a>00783       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux, 1 );     
<a name="l00784"></a>00784       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( op-&gt;baseAux + 1, 0 );     
<a name="l00785"></a>00785       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( op-&gt;baseOut, 0 );
<a name="l00786"></a>00786       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( op-&gt;baseOut + 1, 1 );
<a name="l00787"></a>00787       <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( op-&gt;baseAux, 0 );
<a name="l00788"></a>00788       <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( op-&gt;baseAux + 1, 0 );
<a name="l00789"></a>00789     }
<a name="l00790"></a>00790   }
<a name="l00791"></a>00791 
<a name="l00792"></a>00792   <span class="keywordflow">if</span> ( stateNew )
<a name="l00793"></a>00793   {
<a name="l00794"></a>00794     <span class="keywordtype">int</span> position = 2048 * op-&gt;current / op-&gt;periodOn;
<a name="l00795"></a>00795     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( op-&gt;baseAux, ( position &gt;&gt; 2 ) );
<a name="l00796"></a>00796     <span class="keywordtype">int</span> position1 = ( position &lt; 1023) ? position : 2048 - position;
<a name="l00797"></a>00797     <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( op-&gt;baseAux + 1, position1 );
<a name="l00798"></a>00798   }
<a name="l00799"></a>00799 
<a name="l00800"></a>00800   op-&gt;state = stateNew;
<a name="l00801"></a>00801 }
<a name="l00802"></a>00802 
<a name="l00803"></a>00803 <span class="keywordtype">void</span> Oscillator_DeInit( <span class="keywordtype">void</span>* Oscillator )
<a name="l00804"></a>00804 {
<a name="l00805"></a>00805   OscillatorStruct* op = (OscillatorStruct*)Oscillator;
<a name="l00806"></a>00806   <span class="keywordflow">if</span> ( op != NULL )
<a name="l00807"></a>00807   {
<a name="l00808"></a>00808     <span class="keywordtype">int</span> i;
<a name="l00809"></a>00809 
<a name="l00810"></a>00810     <span class="keywordflow">if</span> ( op-&gt;readConstants )
<a name="l00811"></a>00811       Oscillator_SaveConstants( op );
<a name="l00812"></a>00812 
<a name="l00813"></a>00813     <a class="code" href="group___digital_in.html#g57b7c89eb7c9066b9484577390635f2e" title="Sets whether the specified Digital In is active.">DigitalIn_SetActive</a>( 0, 0 );
<a name="l00814"></a>00814     <a class="code" href="group___digital_in.html#g57b7c89eb7c9066b9484577390635f2e" title="Sets whether the specified Digital In is active.">DigitalIn_SetActive</a>( 1, 0 );
<a name="l00815"></a>00815     <a class="code" href="group___analog_in.html#ga3ae1add8529d6e1882b6c7d5b376b94" title="Sets whether the specified channel is active.">AnalogIn_SetActive</a>( 2, 0 );
<a name="l00816"></a>00816     <a class="code" href="group___analog_in.html#ga3ae1add8529d6e1882b6c7d5b376b94" title="Sets whether the specified channel is active.">AnalogIn_SetActive</a>( 3, 0 );
<a name="l00817"></a>00817 
<a name="l00818"></a>00818     <span class="keywordflow">for</span>( i = op-&gt;baseOut; i &lt; op-&gt;baseOut + 4; i++ )
<a name="l00819"></a>00819     {
<a name="l00820"></a>00820       <a class="code" href="group___digital_out.html#gcd33bd552fe48b82df9f0be1c4985ccd" title="Turn a Digital Out on or off on the MAKE Application Board.">DigitalOut_SetValue</a>( i, 0 );
<a name="l00821"></a>00821       <a class="code" href="group___digital_out.html#ga98b65673615683dbdaa1fc7ee4e4f2f" title="Sets whether the specified Digital Out is active.">DigitalOut_SetActive</a>( i, 0 );
<a name="l00822"></a>00822     }
<a name="l00823"></a>00823 
<a name="l00824"></a>00824     <span class="keywordflow">for</span>( i = op-&gt;baseAux; i &lt; op-&gt;baseAux + 2; i++ )
<a name="l00825"></a>00825     {
<a name="l00826"></a>00826       <a class="code" href="group___app_led.html#gdf0cd1ff241ad17592b9036b674613cc" title="Control an LED on the Application Board.">AppLed_SetState</a>( i, 0 );
<a name="l00827"></a>00827       <a class="code" href="group___app_led.html#gd0ee0aad03c0aa89b442bf75e073510d" title="Attempts to gain access to the I/O lines associated the given LED.">AppLed_SetActive</a>( i, 0 );
<a name="l00828"></a>00828       <a class="code" href="group___servo.html#g6fdf6eb917b9aa2a25939d9a44821b22" title="Set the position of the specified servo motor.">Servo_SetPosition</a>( i, 0 );
<a name="l00829"></a>00829       <a class="code" href="group___servo.html#g8ecf12d7f9b6c7130cac1f0c33270e4b" title="Lock or unlock the I/O lines used by the servos.">Servo_SetActive</a>( i, 0 );
<a name="l00830"></a>00830     }
<a name="l00831"></a>00831 
<a name="l00832"></a>00832     <a class="code" href="group___utils.html#g6b0be54448d6ce393134400f4b22fa97" title="Free memory from the heap.">Free</a>( op );
<a name="l00833"></a>00833   }
<a name="l00834"></a>00834 }
<a name="l00835"></a>00835 
<a name="l00836"></a>00836 <span class="keywordtype">void</span> Oscillator_SaveConstants( OscillatorStruct *op )
<a name="l00837"></a>00837 {
<a name="l00838"></a>00838   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_OSCILLATOR_PERIODOFF + ( op-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;op-&gt;periodOn, 4 );
<a name="l00839"></a>00839   <a class="code" href="group___eeprom.html#g03d8b089bb0d04209e032ea233218d3a" title="Write data to the EEPROM.">Eeprom_Write</a>( EEPROM_POLY_0_OSCILLATOR_PERIODON + ( op-&gt;bank * 8 ), (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *)&amp;op-&gt;periodOff, 4 );
<a name="l00840"></a>00840 }
<a name="l00841"></a>00841 
<a name="l00842"></a>00842 <span class="preprocessor">#if ( APPBOARD_VERSION == 50 )</span>
<a name="l00843"></a>00843 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_0_IO IO_PA02</span>
<a name="l00844"></a>00844 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_1_IO IO_PA02</span>
<a name="l00845"></a>00845 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_2_IO IO_PA02</span>
<a name="l00846"></a>00846 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_3_IO IO_PA02</span>
<a name="l00847"></a>00847 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_4_IO IO_PA02</span>
<a name="l00848"></a>00848 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_5_IO IO_PA02</span>
<a name="l00849"></a>00849 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_6_IO IO_PA02</span>
<a name="l00850"></a>00850 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_7_IO IO_PA02</span>
<a name="l00851"></a>00851 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_01_ENABLE IO_PA02</span>
<a name="l00852"></a>00852 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_23_ENABLE IO_PA02</span>
<a name="l00853"></a>00853 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_45_ENABLE IO_PA02</span>
<a name="l00854"></a>00854 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_67_ENABLE IO_PA02</span>
<a name="l00855"></a>00855 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00856"></a>00856 <span class="preprocessor"></span>
<a name="l00857"></a>00857 <span class="preprocessor">#if ( APPBOARD_VERSION == 90 )</span>
<a name="l00858"></a>00858 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_0_IO IO_PB23</span>
<a name="l00859"></a>00859 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_1_IO IO_PA26</span>
<a name="l00860"></a>00860 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_2_IO IO_PA25</span>
<a name="l00861"></a>00861 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_3_IO IO_PB25</span>
<a name="l00862"></a>00862 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_4_IO IO_PA02</span>
<a name="l00863"></a>00863 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_5_IO IO_PA06</span>
<a name="l00864"></a>00864 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_6_IO IO_PA05</span>
<a name="l00865"></a>00865 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_7_IO IO_PA24</span>
<a name="l00866"></a>00866 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_01_ENABLE IO_PB19</span>
<a name="l00867"></a>00867 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_23_ENABLE IO_PB20</span>
<a name="l00868"></a>00868 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_45_ENABLE IO_PB21</span>
<a name="l00869"></a>00869 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_67_ENABLE IO_PB22</span>
<a name="l00870"></a>00870 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00871"></a>00871 <span class="preprocessor"></span><span class="preprocessor">#if ( APPBOARD_VERSION == 95 || APPBOARD_VERSION == 100 )</span>
<a name="l00872"></a>00872 <span class="preprocessor"></span>
<a name="l00873"></a>00873 <span class="preprocessor">  #define DIGITALOUT_0_IO IO_PA24</span>
<a name="l00874"></a>00874 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_1_IO IO_PA05</span>
<a name="l00875"></a>00875 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_2_IO IO_PA06</span>
<a name="l00876"></a>00876 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_3_IO IO_PA02</span>
<a name="l00877"></a>00877 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_4_IO IO_PB25</span>
<a name="l00878"></a>00878 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_5_IO IO_PA25</span>
<a name="l00879"></a>00879 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_6_IO IO_PA26</span>
<a name="l00880"></a>00880 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_7_IO IO_PB23</span>
<a name="l00881"></a>00881 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_01_ENABLE IO_PB19</span>
<a name="l00882"></a>00882 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_23_ENABLE IO_PB20</span>
<a name="l00883"></a>00883 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_45_ENABLE IO_PB21</span>
<a name="l00884"></a>00884 <span class="preprocessor"></span><span class="preprocessor">  #define DIGITALOUT_67_ENABLE IO_PB22</span>
<a name="l00885"></a>00885 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
<a name="l00886"></a>00886 <span class="preprocessor"></span>
<a name="l00887"></a>00887 <span class="keywordtype">int</span> Poly_Ios[] =
<a name="l00888"></a>00888 {
<a name="l00889"></a>00889   DIGITALOUT_0_IO,
<a name="l00890"></a>00890   DIGITALOUT_1_IO, 
<a name="l00891"></a>00891   DIGITALOUT_2_IO, 
<a name="l00892"></a>00892   DIGITALOUT_3_IO, 
<a name="l00893"></a>00893   DIGITALOUT_4_IO, 
<a name="l00894"></a>00894   DIGITALOUT_5_IO, 
<a name="l00895"></a>00895   DIGITALOUT_6_IO, 
<a name="l00896"></a>00896   DIGITALOUT_7_IO, 
<a name="l00897"></a>00897   0
<a name="l00898"></a>00898 };
<a name="l00899"></a>00899 
<a name="l00900"></a>00900 <span class="keywordtype">int</span> Poly_Enables[] =
<a name="l00901"></a>00901 {
<a name="l00902"></a>00902   DIGITALOUT_01_ENABLE, 
<a name="l00903"></a>00903   DIGITALOUT_23_ENABLE, 
<a name="l00904"></a>00904   DIGITALOUT_45_ENABLE, 
<a name="l00905"></a>00905   DIGITALOUT_67_ENABLE,
<a name="l00906"></a>00906   0
<a name="l00907"></a>00907 };
<a name="l00908"></a>00908 
<a name="l00909"></a>00909 <span class="keywordtype">void</span> Poly_LineInit()
<a name="l00910"></a>00910 {
<a name="l00911"></a>00911   <span class="comment">// Lines OFF</span>
<a name="l00912"></a>00912   <span class="keywordtype">int</span>* piop = Poly_Ios;
<a name="l00913"></a>00913   <span class="keywordflow">while</span> ( *piop )
<a name="l00914"></a>00914     Io_SetFalse( *piop++ );
<a name="l00915"></a>00915 
<a name="l00916"></a>00916   <span class="comment">// ENABLES ON</span>
<a name="l00917"></a>00917   piop = Poly_Enables;
<a name="l00918"></a>00918   <span class="keywordflow">while</span> ( *piop )
<a name="l00919"></a>00919     Io_SetTrue( *piop++ );
<a name="l00920"></a>00920 }
<a name="l00921"></a>00921 <span class="comment"></span>
<a name="l00922"></a>00922 <span class="comment">/** @}</span>
<a name="l00923"></a>00923 <span class="comment">  */</span>
<a name="l00924"></a>00924 
</pre></div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Make Controller Kit</title>
<style type="text/css">
<!--
.footer {
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 9pt;
	color: #999999;
}
-->
</style>
</head>

<body>
<hr size="1">
<div>
  <p class="footer">The Make Controller Kit is an open source project maintained by <a href="http://www.makingthings.com">MakingThings</a>.<br />
    MakingThings code is released under the <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">Apache 2.0 license</a>.<br />
    Bug tracker, development wiki and status can be found at <a href="http://dev.makingthings.com">http://dev.makingthings.com</a>.<br />
		This document was last updated on 5 Dec 2007.
</p>
</div>
<!-- Google Analytics Code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-769030-1";
urchinTracker();
</script>
</body>
</html>
